import zipfile
from lxml import etree
from docx import Document

def num2str(num=0, fmt=''):
    """
    数字转换docx对应的序列号支持到3级
    decimal: 数字（1, 2, 3...）
    lowerRoman: 小写罗马数字（i, ii, iii...）
    upperRoman: 大写罗马数字（I, II, III...）
    lowerLetter: 小写字母（a, b, c...）
    upperLetter: 大写字母（A, B, C...）
    chineseCounting: 中文数字（一、二、三...）
    chineseCountingTraditional: 传统中文数字（壹、貳、叁...）
    chineseOrdinal: 中文序数词（第一、第二、第三...）
    chineseOrdinalTraditional: 传统中文序数词（第壹、第貳、第叁...）
    bullet: 子弹点（默认为圆形）
    square: 方形子弹点
    dash: 破折号
    hyphen: 短横线
    period: 圆点
    fullwideArabic: 全角阿拉伯数字（１，２，３...）
    fullwideLowerLetter: 全角小写字母（ａ，ｂ，ｃ...）
    fullwideUpperLetter: 全角大写字母（Ａ，Ｂ，Ｃ...）
    fullwideLowerRoman: 全角小写罗马数字（ｉ，ｉｉ，ｉｉｉ...）
    fullwideUpperRoman: 全角大写罗马数字（Ｉ，ＩＩ，ＩＩＩ...）
    since:2024-04-23
    """
    print('num, fmt', num, fmt)
    # if num_type == 0:
    #     # 0 < num < 100
    #     str_num = _number_to_chinese_ordinal(num)
    if fmt in ['decimal']:
        str_num = f"{num}."
    elif fmt in ['upperLetter']:
        str_num = {1: 'A', 2: 'B', 3: 'C', 4: 'D', 5: 'E', 6: 'F'}
    return str_num
# 打开docx文件
docx_path = 'example.docx'
with zipfile.ZipFile(docx_path, 'r') as docx:
    # 读取numbering.xml文件
    numbering_xml = docx.read('word/numbering.xml')

# 解析XML内容
root = etree.fromstring(numbering_xml)

# 创建一个字典来保存编号信息
num_dict = {}

# 遍历w:num元素来获取每个编号的id和起始值
for num in root.iter('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}num'):
    num_id = num.find('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}abstractNumId').get('val')
    lvl_elems = num.findall('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}lvl')
    levels = {}
    for lvl in lvl_elems:
        ilvl = int(lvl.get('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}ilvl'))
        start = int(lvl.find('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}start').get('val'))
        levels[ilvl] = start
    num_dict[num_id] = levels

# 打开docx文档
doc = Document(docx_path)

# 创建一个编号字典来记录当前编号
current_nums = {}

# 遍历文档中的段落
for para in doc.paragraphs:
    # 获取段落属性
    pPr = para._element.pPr
    if pPr is not None:
        # 检查段落是否有编号
        numPr = pPr.numPr
        if numPr is not None and numPr.ilvl is not None:
            ilvl = int(numPr.ilvl.get('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}val'))
            numId = numPr.numId.get('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}val')
            if numId in num_dict and ilvl in num_dict[numId]:
                if numId not in current_nums:
                    current_nums[numId] = {}
                if ilvl not in current_nums[numId]:
                    current_nums[numId][ilvl] = num_dict[numId][ilvl]
                else:
                    current_nums[numId][ilvl] += 1

                # 生成编号字符串
                num_str = ".".join(str(current_nums[numId][i]) for i in range(ilvl + 1))
                # 在段落文本前插入编号字符串
                para.insert(0, f"{num_str} ")

# 保存修改后的文档
doc.save('example2.docx')
